import json
import os.path
from django.core.paginator import Paginator
from django.views.decorators.csrf import csrf_exempt

from noflip_web.settings import BASE_DIR
from noflip_web.globals import engine_ins_dc
from django.shortcuts import render
from django.http import HttpResponse, JsonResponse
import ast
from operate.models import MkData, SgTactic
from tools.methods import save_global_send_data, send_data_to_front


def overview_page(request):
    # 获取介绍页文本
    active_engine = engine_ins_dc["active_engine"]
    engine_ins = engine_ins_dc["single_engine_dc"][active_engine]
    model_data = engine_ins.variable_value
    context = {"model_data": model_data}
    return render(request, 'introduce.html', context)


def data_page(request):
    # 从engine中加载当前引擎已经备选的数据名
    active_engine = engine_ins_dc["active_engine"]
    engine_ins = engine_ins_dc["single_engine_dc"][active_engine]
    selected_data_ls = engine_ins.variable_value["lab_var_part2_2"]["selected_data_ls"]

    # 从数据库中加载所有的数据列表
    data_list = MkData.objects.all()
    paginator = Paginator(data_list, 10)  # 每页显示 10 条数据
    page_number = request.GET.get('page')
    data_s = paginator.get_page(page_number)

    context = {
        "selected_data_ls": selected_data_ls,
        "data_s": data_s
    }

    return render(request, 'data.html', context)


@csrf_exempt
def select_data(request):
    # 接收前端提供的预选数据名，并将其更新到variable再返回前端
    if request.method == 'POST':
        # 获取选中的数据项的 name 列表
        selected_names = request.POST.getlist('selected_names')

        # 打印接收到的选中数据（可在此基础上进行进一步处理）
        # 获取全局变量中当前model的veriable，并更改
        model_data = engine_ins_dc["all_variable"][engine_ins_dc["active_engine"]]
        # 综合selected_names和model_data["lab_var_part2_2"]["selected_data_ls"]的值
        selected_names = list(set(selected_names + model_data["lab_var_part2_2"]["selected_data_ls"]))

        model_data["lab_var_part2_2"]["selected_data_ls"] = selected_names
        context = {
            "model_data": model_data,
        }
        # 将更改后的variable返回到前端

        # 示例返回 JSON 响应（你可以根据需要修改）
        return save_global_send_data(context)
    else:
        return JsonResponse({'success': False, 'message': 'Invalid request method'}, status=405)


@csrf_exempt
def delete_data(request):
    # 接收前端提供的预选数据名，并将其更新到variable再返回前端
    if request.method == 'POST':
        # 获取选中的数据项的 name 列表
        data = json.loads(request.body)
        selected_name = data.get('name')
        # 获取全局变量中当前model的veriable，并更改
        model_data = engine_ins_dc["all_variable"][engine_ins_dc["active_engine"]]
        model_data["lab_var_part2_2"]["selected_data_ls"].remove(selected_name)
        context = {
            "model_data": model_data,
        }
        # 将更改后的variable返回到前端

        # 示例返回 JSON 响应（你可以根据需要修改）
        return save_global_send_data(context)
    else:
        return JsonResponse({'success': False, 'message': 'Invalid request method'}, status=405)


def tactic_page(request):
    # 获取战法列表并返回前端
    # 获取variable中选中的战法
    active_engine = engine_ins_dc["active_engine"]
    engine_ins = engine_ins_dc["single_engine_dc"][active_engine]
    selected_tactics_ls = engine_ins.variable_value["lab_var_part2_3"]["selected_tactics_ls"]

    # 获取战法模块中所有战法类的类名
    sg_tactic_s = SgTactic.objects.all().order_by('id')
    paginator = Paginator(sg_tactic_s, 10)  # 每页显示 10 条数据
    page_number = request.GET.get('page')
    tactic_s = paginator.get_page(page_number)

    context = {
        "selected_tactic_ls": selected_tactics_ls,
        "tactic_s": tactic_s
    }
    return render(request, 'tactics.html', context)


@csrf_exempt
def select_tactic(request):
    # 接收前端提供的预选数据名，并将其更新到variable再返回前端
    if request.method == 'POST':
        # 获取选中的数据项的 name 列表
        selected_names = request.POST.getlist('selected_names')

        # 打印接收到的选中数据（可在此基础上进行进一步处理）
        print("Selected Names:", selected_names)
        # 获取全局变量中当前model的veriable，并更改
        model_data = engine_ins_dc["all_variable"][engine_ins_dc["active_engine"]]
        # 对selected_names重新整理，使其为名称加简介的形式
        selected_tactics_ls = []
        for selected_name in selected_names:
            # 根据名称查找简介
            sg_tactic = SgTactic.objects.get(name=selected_name)
            selected_tactics_ls.append(sg_tactic.tactic_type + " | " + sg_tactic.name + " | " + sg_tactic.describe)

        # 综合selected_names和model_data["lab_var_part2_3"]["selected_tactics_ls"]的值
        selected_tactics_ls = list(set(selected_tactics_ls + model_data["lab_var_part2_3"]["selected_tactics_ls"]))

        # 按照首字母升序排列
        selected_tactics_ls = sorted(selected_tactics_ls)
        model_data["lab_var_part2_3"]["selected_tactics_ls"] = selected_tactics_ls
        context = {
            "model_data": model_data,
        }
        # 将更改后的variable返回到前端

        # 示例返回 JSON 响应（你可以根据需要修改）
        return save_global_send_data(context)
    else:
        return JsonResponse({'success': False, 'message': 'Invalid request method'}, status=405)


@csrf_exempt
def delete_tactic(request):
    # 接收前端提供的预选数据名，并将其更新到variable再返回前端
    if request.method == 'POST':
        # 获取选中的数据项的 name 列表
        data = json.loads(request.body)
        selected_name = data.get('name')
        # 获取全局变量中当前model的veriable，并更改
        model_data = engine_ins_dc["all_variable"][engine_ins_dc["active_engine"]]
        for tactic_group in model_data["lab_var_part2_3"]["selected_tactics_ls"]:
            if selected_name == tactic_group.split(" | ")[1]:
                model_data["lab_var_part2_3"]["selected_tactics_ls"].remove(tactic_group)
                break
        context = {
            "model_data": model_data,
        }
        # 将更改后的variable返回到前端

        # 示例返回 JSON 响应（你可以根据需要修改）
        return save_global_send_data(context)
    else:
        return JsonResponse({'success': False, 'message': 'Invalid request method'}, status=405)


def tactic_ok(request):
    # 接收前端确认战法选择的请求，并将相应变量更新，再返回前端

    return HttpResponse()


def factor_page(request):
    # 执行engine_ins获取因子列表，并返回前端
    active_engine = engine_ins_dc["active_engine"]
    engine_ins = engine_ins_dc["single_engine_dc"][active_engine]
    tactics_factor_ls = engine_ins.variable_value["lab_var_part2_4"]["tactics_factor_ls"]
    # 获取因子的说明
    from object.single.factor import describe_dc
    show_describe_dc = {}
    for k, v in describe_dc.items():
        if k in tactics_factor_ls:
            show_describe_dc[k] = v
    context = {
        "show_describe_dc": show_describe_dc
    }
    return render(request, 'factor.html', context)


def get_factor(request):
    # 从engine_ins获取选择的战法，并提取里面的因子到相应变量，并返回前端
    return HttpResponse()


def calculate_factor(request):
    # 根据engine_ins记录的factor，来生产因子数据，并将因子概览返回前端
    return HttpResponse()


def fruit_page(request):
    return render(request, 'backtest.html')


def get_variable(request):
    # 从engine_ins获取与回测结果相关数据，并将回测结果返回前端，考虑空值的处理
    model_name_code = engine_ins_dc["active_engine"]
    engine_ins = engine_ins_dc["single_engine_dc"][model_name_code]
    variable_value = engine_ins.variable_value
    context = {"model_data": variable_value}
    return send_data_to_front(context)


def start_backtest(request):
    # 执行回测方法，将更新进度数据、回测图像、指标、描述文本等显示到前端
    return HttpResponse()


# 获取前端需要的数据
def get_operate_data(request):
    data_type = request.GET.get("data_type")
    if data_type == "overview_data":
        # 根据engine_ins返回概览数据

        pass
    elif data_type == "data_data":
        # 结合engine_ins和数据库model获取前端显示的内容

        pass
    elif data_type == "tactics_data":
        # 结合engine_ins和战法类文件实际情况获取前端显示的内容

        pass
    elif data_type == "factor_data":
        # 结合engine_ins获取前端显示的内容

        pass
    elif data_type == "backtest_data":
        # 结合engine_ins获取前端显示的内容

        pass
    else:
        raise ValueError("未收录的数据类型")







